package com.tom.angel.util;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharEncodingFilter implements Filter {

	/**
	 * The default character encoding to set for request that pass through
	 * this filter
	 */
	protected String charEncoding = null;
	
	/**
	 * The filter configuration object we are associated with. 
	 * If this value is null, this filter instance is not currently configured.
	 */
	 protected FilterConfig filterConfig = null;
	 
	 /**
	  * need a charencoding specified by the client be ignored 
	  */
	 protected boolean ignore = true;
	 
	 
	 //*******************public methods************************
	
	 /**
	  * Take this filter out of service.
	  */
	 public void destroy() {
		 this.charEncoding = null;
		 this.filterConfig = null;
	 }

	 
	 /**
	  * Select and set (if specified) the character encoding to be used to
	  * interpret request parameters for this request.
	  * 
	  * @param request The servlet request we are processing
	  * @param result The servlet response we are creating
	  * @param chain The filter chain we are processing
	  * 
	  * @exception IOException if an input/output error occurs
	  * @exception ServletException if a servlet error occurs
	  */
	 public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		 
		 // Conditionally select and set the character encoding to be used
		 if (ignore || (request.getCharacterEncoding() == null)){
			 String encoding = request.getCharacterEncoding();
			 if(encoding != null){
				 request.setCharacterEncoding(encoding);
			 }
		 }
		 //Pass control on to the next filter
		 chain.doFilter(request, response);
	 }

	 /**
	  * Place this filter into service.
	  * 
	  * @param filterConfig The filter configuration object
	  * 
	  * @exception ServletException if a servlet error occurs
	  */
	 public void init(FilterConfig filterConfig) throws ServletException {
		
		 //this is formal parameter assignment real parameter
		 this.filterConfig = filterConfig;
		 
		 //this is get filterConfig's value that 'key' is encoding
		 this.charEncoding = filterConfig.getInitParameter("encoding");
		 
		 //this is get filterConfig's value that 'key' is ignore
		 String value = filterConfig.getInitParameter("ignore");
		 
		 //will judgement 'value'
		 if (value == null){
			 this.ignore = true;
		 }else if (value.equalsIgnoreCase("true")){
			 this.ignore = true;
		 }else if (value.equalsIgnoreCase("yes")){
			 this.ignore = true;
		 }else{
			 this.ignore = false;
		 }
	 }
	 
	//*******************protected methods************************
	 
	 /**
	  * Select an appropriate character encoding to be used, based on the
	  * characteristics of the current request and/or filter initialization
	  * parameters. If no character encoding should be set, return
	  * <p>
	  *  The default implementation unconditionally returns the value configured
	  * @param request The servlet request we are processing
	  * @return String
	  */
     protected String selectEncoding(ServletRequest request){
         return (this.charEncoding);
     }

 }
